#ifndef LONG_INT_T
#define LONG_INT_T
#include <fstream>
#include <vector>
#include <string>
#include <cmath>

struct long_int_t
{
   public :

      long_int_t(int = 0);
      long_int_t(const std::vector<int> &);
      long_int_t& operator *=(const long_int_t &);
      long_int_t& operator -=(const long_int_t &);
      long_int_t& operator /=(const long_int_t &);
      long_int_t& operator %=(const long_int_t &);
      long_int_t& operator +=(const long_int_t &);

      bool operator ==(const long_int_t &) const;
      bool operator >(const long_int_t &) const;
      bool operator !=(const long_int_t &) const;
      bool operator >=(const long_int_t &) const;
      bool operator <(const long_int_t &) const;

      std::pair<long_int_t, long_int_t> divide_with_remainder(const long_int_t &) const;

      friend std::ostream& operator <<(std::ostream &, const long_int_t);
      friend std::istream& operator >>(std::istream &, long_int_t &);

   private :
      
      std::vector <int> digits_;
      static const int BASE = 1000000000;

      int find_digit_divisor(const long_int_t &) const; 
      void cut_zeroes();  
      int compare_to(const long_int_t &) const;
      long_int_t& operator <<=(int);
      long_int_t& operator >>=(size_t);
      
};
#endif